/**
 * @Author: zxc
 * @Date: 2020-10-31 13:45:18
 * @func:两数之和
 */

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
// var addTwoNumbers = function(l1, l2) {
//   const node = new ListNode('header');
//   let temp = node;
//   let sum = 0 , carry = 0;
//   while(l1 || l2 || carry){
//       /**
//        * @Author: zxc
//        * @Date: 2020-11-06 13:45:05
//        * @func:
//        */
//       const firstVal = l1 ? l1.val : 0
//       const secVal = l2 ? l2.val : 0
//       sum = firstVal + secVal + carry
//       carry = parseInt(sum / 10)
//       temp.next = new ListNode(sum % 10);
//       temp = temp.next;
//       if(l1) l1 = l1.next
//       if(l2) l2 = l2.next
//   }
//   return node.next
// };

// /**
//  * @param {ListNode} l1
//  * @param {ListNode} l2
//  * @return {ListNode}
//  */
// var addTwoNumbers = function(l1, l2) {
//   return diffFunc(l1 , l2)
// };

// const diffFunc = ( firstNode , secNode , carry = 0) => {
//   if(firstNode || secNode || carry) {
//       let firstVal = firstNode ? firstNode.val : 0
//       let secVal = secNode ? secNode.val : 0
//       let sum = firstVal + secVal + carry
//       let n = parseInt(sum % 10)
//       carry = parseInt( sum / 10 )
//       let node = new ListNode(n)
//       node.next = diffFunc(
//         firstNode ? firstNode.next : null,
//         secNode ? secNode.next : null,
//         carry);
//       return node
//   } else return null
// }

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  const diffFunc = node => {
    return ((node.next && diffFunc(node.next)) || "") + node.val
  }
  return String(BigInt(diffFunc(l1)) + BigInt(diffFunc(l2)))
    .split("")
    .reduce((next, val) => ({ val, next }), null)
}
